package com.company.generic;

import com.company.abstractClass.ADHero;
import com.company.abstractClass.APHero;
import com.company.abstractClass.Hero;
import com.company.inheritance.Item;

import java.util.ArrayList;

/**
 * 不使用泛型带来的问题
 * ADHero(物理攻击英雄) APHero(魔法攻击英雄) 都是Hero的子类
 * ArrayList默认接受Object类型的对象，所以所有的对象都可以放进ArrayList中
 * 所以get(0)返回的是Object
 * 接着， 需要进行强制转换才可以得到APHero类型或者ADHero类型。
 * 如果软件开发人员的记忆比较好，能记得哪个是哪个，还是可以的。但是开发人员会犯错误，
 * 比如第20行，会记错。把第0个对象转换为AdHero，这样就会出现类型转换异常。
 * **/
public class TestGeneric {
    public static void main(String[] args) {
        //------------------------------------------------------
//        ArrayList heros = new ArrayList();
//        heros.add(new APHero());
//        heros.add(new ADHero());
//
//        APHero apHero = (APHero)heros.get(0);
//        ADHero adHero = (ADHero)heros.get(1);
//
//        ADHero adHero1 = (ADHero)heros.get(0); //会出错， 类型强制转换错误
        /** ---------------------------------------------------
         * 使用泛型的好处
         * 泛型的用法是在容器后面添加<Type>
         * Type可以是类，抽象类， 接口
         * 泛型表示这种容器，只能存放APHEro, ADHero就放不进去了
         * **/
//        ArrayList<APHero> heros = new ArrayList<>();
        //只有APHero可以放进去
//        heros.add(new APHero());
        //ADHero甚至放不进去
        //heros.add(ADHero);
        /**获取的时候也不需要转型， 因为取出来一定是APHero**/

        /**
         * 子类对象
         *  子类假设容器的泛型值Hero，那么Hero的子类APHero，
         *  ADHero都可以放进去和Hero无关的类型Item还是放不进去
         * **/
        ArrayList<Hero> heroes = new ArrayList<>();
        heroes.add(new APHero());
        heroes.add(new ADHero());
        /***放不进去*/
//        heroes.add(new Item())
        /**
         * 泛型的简写
         * ArrayList<Hero> heros = new ArrayList<Hero>()
         *   |
         *   v
         * ArrayList<Hero> heros = new ArrayList<>()
         * **/

    }
}
